<?php

/**
 * 返回数组里面的其中一个key的value值作为索引的索引数组
 * @modify trainyao 2015-09-26 创建
 * @modify trainyao 2016-01-04 增加索引重复支持
 * @modify trainyao 2016-01-06 增加保持一对多格式支持
 * @param array $dataArray  待处理数组
 * @param string $keyName  待处理数组条目中的一个key
 * @param string $multi    是否保持一对多格式
 * @return array
 */
function getArrayValueAsIndex($dataArray, $keyName, $multi = false) {
    $dataArray = array_values($dataArray);
    if(empty($dataArray) || !isset($dataArray[0][$keyName])) {
        return array();
    }
    
    $indexArray = array();
    $recordArray = array();
    if($multi === false) {
        foreach ($dataArray as $dataItem) {
            if(empty($recordArray[$dataItem[$keyName]])) {
                $indexArray[$dataItem[$keyName]] = $dataItem;
                $recordArray[$dataItem[$keyName]] = 1;
            } else if($recordArray[$dataItem[$keyName]] == 1) {
                $indexArray[$dataItem[$keyName]] = array(
                    $indexArray[$dataItem[$keyName]],
                    $dataItem
                );
                $recordArray[$dataItem[$keyName]] = 2;
            } else {
                array_push($indexArray[$dataItem[$keyName]], $dataItem);
            }
        }
    } else {
        foreach ($dataArray as $dataItem) {
            if(empty($indexArray[$dataItem[$keyName]])) {
                $indexArray[$dataItem[$keyName]] = array();
            }
            array_push($indexArray[$dataItem[$keyName]], $dataItem);
        }
    }

    unset($dataArray);
    unset($recordArray);
    return $indexArray;
}

/**
 * 根据数组字段值是否在范围内,筛选数组
 * @modify trainyao 2016-06-30 创建
 * @param  array   $array     输入数组,[{keyName=>value}, {},...]
 * @param  string   $keyName   字段名
 * @param  array   $range     符合条件的范围,[rangeValue1, rangeValue2]
 * @return array              筛选过后的数据
 */
function fliterArrayByKey($array, $keyName, $range) {
    if (empty($range) || !isset($array[0][$keyName])) {
        return array();
    }

    foreach ($array as $index => $arrayValue) {
        if (!in_array($arrayValue[$keyName], $range)) {
            unset($array[$index]);
        }
    }
    unset($arrayValue);
    return array_values($array);
}

/**
 * 需要的参数是否都有
 * @param array $paramArr 需校验的数组与需校验的key 注意传递参数顺序:array($arrayToValidate, 'key1', 'key2', ...)
 * @return boolean 检测结果
 */
function isExistParams($paramArr) {

    $varArray = func_get_args();
    $count = count($varArray);
    for ($i = 1; $i < $count; $i++) {
        if (!array_key_exists($varArray[$i], $paramArr)) {
            return false;
        }
    }
    return true;
}

/**
 * 是否有其中一个参数
 * @param array $paramArr 需校验的数组与需校验的key 注意传递参数顺序:array($arrayToValidate, 'key1', 'key2', ...)
 * @return boolean 检测结果
 */
function isExistPartParams($paramArr) {
    $varArray = func_get_args();
    $count = count($varArray);
    for ($i = 1; $i < $count; $i++) {
        if (array_key_exists($varArray[$i], $paramArr)) {
            return true;
        }
    }
    return false;
}

/**
 * 返回数组用字符串链接格式的字符串,默认用英文逗号链接
 * @modify trainyao 2015-10-12 创建
 * @param mixin $input 待处理数据,有可能是integer,string,array
 * @param string $glue 链接字符串
 * @return string 英文逗号链接字符串
 */
function getConcatString($input, $glue = ',') {
    if(empty($input)) {
        return '';
    }
    if(is_array($input)) {
        return implode($glue, $input);
    }

    // 处理传入是单个数字情况
    return $input . '';
}

/**
 *  @desc 根据两点间的经纬度计算距离
 *  @modify wenhui 2016-12-28 创建
 *  @param float $lat 纬度值
 *  @param float $lng 经度值
 */
function getDistance($lat1, $lng1, $lat2, $lng2) {
     $earthRadius = 6367000; //approximate radius of earth in meters  近似地球半径

     /*
       Convert these degrees to radians 将这些数据转换为弧度
       to work with the formula 用公式工作
     */

     $lat1 = ($lat1 * pi() ) / 180;
     $lng1 = ($lng1 * pi() ) / 180;

     $lat2 = ($lat2 * pi() ) / 180;
     $lng2 = ($lng2 * pi() ) / 180;

     /*
       Using the
       Haversine formula  利用Haversine公式
       calculate the distance 计算距离
       在线计算两点距离的地址：http://www.nhc.noaa.gov/gccalc.shtml
     */

     $calcLongitude = $lng2 - $lng1;
     $calcLatitude = $lat2 - $lat1;
     $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);  $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
     $calculatedDistance = $earthRadius * $stepTwo;

     return round($calculatedDistance);
 }

 /**
 * 把图片转换成 base64 格式
 * @modify wenhui 2017-06-19             创建
 * @param  object   $image_file 图片路径
 * @return string                          版本字符串
 */
function base64EncodeImage ($image_file) {
  $base64_image = '';
  $image_info = getimagesize($image_file);  
  $image_data = fread(fopen($image_file, 'r'), filesize($image_file));
  $base64_image = chunk_split(base64_encode($image_data));  
  return $base64_image;

}

/**
 * 获取图片数据
 * @modify wenhui 2017-06-19             创建
 * @param  dataArray   格式 array('face'=>'./正面图片路径', 'back'=>'./反面图片路径'  )
 * @return array $data            
 */
function getIdDate ($dataArray) {

    if (empty($dataArray) || !isset($dataArray['face'])) {
        return false;
    }

    // 把图片转换成 base64 格式
    $face = isset($dataArray['face']) ? base64EncodeImage($dataArray['face']) : null;
    $back = isset($dataArray['back']) ? base64EncodeImage($dataArray['back']) : null;

    $host = "https://dm-51.data.aliyun.com";
    $path = "/rest/160601/ocr/ocr_idcard.json";
    $method = "POST";
    $appcode = C('APPCODE');
    $headers = array();
    array_push($headers, "Authorization:APPCODE " . $appcode);
    //根据API的要求，定义相对应的Content-Type
    array_push($headers, "Content-Type".":"."application/json; charset=UTF-8");
    $querys = "";
    $bodys = "{
        \"inputs\": [
            {
                \"image\": {
                    \"dataType\": 50,
                    \"dataValue\": \"{$face}\"
                },
                \"configure\": {
                    \"dataType\": 50,
                    \"dataValue\": \"{\\\"side\\\":\\\"face\\\"}\"
                }
            }
        ]
    }";

    if (!is_null($back)) {
        $bodys = "{
            \"inputs\": [
                {
                    \"image\": {
                        \"dataType\": 50,
                        \"dataValue\": \"{$face}\"
                    },
                    \"configure\": {
                        \"dataType\": 50,
                        \"dataValue\": \"{\\\"side\\\":\\\"face\\\"}\"
                    }
                },
                {
                    \"image\": {
                        \"dataType\": 50,
                        \"dataValue\": \"{$back}\"
                    },
                    \"configure\": {
                        \"dataType\": 50,
                        \"dataValue\": \"{\\\"side\\\":\\\"back\\\"}\"
                    }
                }
            ]
        }";
    }

    $url = $host . $path;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    if (1 == strpos("$".$host, "https://"))
    {
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }
    curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);
    $jsonData = curl_exec($curl);    
    curl_close($curl);
    if ($jsonData == false) {
        return false;
    }
    $jsonData = json_decode($jsonData, true);
   
    return $jsonData;
}